const path = require("path");
const fs = require("fs");
const createError = require("http-errors"); // 检验错误类型
const express = require("express");
const cookieParser = require("cookie-parser"); // 解析 cookie
const logger = require("morgan"); // 日志

const session = require("express-session"); // session
const RedisStore = require("connect-redis")(session); // redis session
const blogRouter = require("./routes/blog");
const userRouter = require("./routes/user");
const app = express(); // 创建express实例

// 使用 morgan 中间件
const ENV = process.env.NODE_ENV; // 获取环境变量
if (ENV !== "production") {
  app.use(logger("dev")); // 开发环境 / 测试环境
} else {
  const logFileName = path.join(__dirname, "logs", "access.log"); // 线上环境
  const writeStream = fs.createWriteStream(logFileName, {
    flags: "a",
  });
  app.use(
    logger("combined", {
      stream: writeStream,
    })
  );
}
app.use(express.json()); // 解析 JSON 数据
// 解析 URL 编码数据
app.use(
  express.urlencoded({
    extended: false, // 表示不解析URL字符串的空格字符（默认为true时会解析）
  })
);
app.use(cookieParser()); // 解析 cookie

// 设置 session
const redisClient = require("./db/redis"); // 引入redis
const sessionStore = new RedisStore({
  client: redisClient,
});
app.use(
  session({
    secret: "myblog", //  用于生成 session 的签名
    cookie: {
      // path: "/", // 设置cookie的路径 - 失效路由 不然其他路由会失效
      // httpOnly: true, // 设置cookie是否只能通过http请求访问
      maxAge: 24 * 60 * 60 * 1000, // 设置cookie的过期时间
    },
    store: sessionStore, // 设置 session 存储
    resave: false, // 是否每次都重新保存session，即使没有修改
    saveUninitialized: false, // 是否保存未初始化的session
  })
);

app.use("/api/blog", blogRouter); // 注册博客路由
app.use("/api/user", userRouter); // 注册用户路由

// 捕获404错误，并传递给错误处理中间件
app.use(function (req, res, next) {
  next(createError(404)); // 传递错误对象给下一个中间件
});
// app.all("*", (req, res) => {
//   res.send("404 Not Found");
// });

// 服务器错误处理
app.use(function (err, req, res, next) {
  res.locals.message = err.message; // 将错误信息传递给视图
  res.locals.error = req.app.get("env") === "dev" ? err : {}; // 只在开发环境下提供错误详情
  res.status(err.status || 500); // 设置响应状态码
  res.render("error"); // 渲染错误页面
});
module.exports = app;
